import redpic as rp
import kenv as kv
import numpy as np
import holoviews as hv
hv.extension('matplotlib')
import warnings
warnings.filterwarnings('ignore')
rp.__version__
kv.__version__
%output size=150 backend='matplotlib' fig='png' dpi=200
%opts Curve Scatter [aspect=3 show_grid=True]
%opts Curve (linewidth=1 alpha=0.7 color='blue')
%opts Scatter (alpha=0.7 s=0.5)
acc = rp.Accelerator(0.7, 7.7, 0.01)
# Unique name, z-position [m], Ez [MV/m], Ez(z) profile
acc.add_accel('Acc. 1', 4.096, -1.1, 'Ez.dat')
acc.add_accel('Acc. 2', 5.944, -1.1, 'Ez.dat')
acc.add_accel('Acc. 3', 6.796, -1.1, 'Ez.dat')
acc.add_accel('Acc. 4', 8.644, -1.1, 'Ez.dat')
acc.add_accel('Acc. 5', 9.496, -1.1, 'Ez.dat')
# Unique name, z-position [m], Bz [T], Bz(z) profile
acc.add_solenoid('Sol. 1', 0.45, -0.058, 'Bz.dat')
acc.add_solenoid('Sol. 2', 0.957, 0.039, 'Bz.dat')
acc.add_solenoid('Sol. 3', 2.107, 0.025, 'Bz.dat')
acc.add_solenoid('Sol. 4', 2.907, 0.044, 'Bz.dat')
acc.add_solenoid('Sol. 5', 3.670, 0.04, 'Bz.dat')
acc.add_solenoid('Sol. 6', 4.570, 0.0595, 'Bz.dat')
acc.add_solenoid('Sol. 7', 5.470, 0.059, 'Bz.dat')
acc.add_solenoid('Sol. 8', 6.370, 0.060, 'Bz.dat')
acc.add_solenoid('Sol. 9', 7.270, 0.065, 'Bz.dat')
acc.add_solenoid('Sol. 10', 8.170, 0.065, 'Bz.dat')
acc.add_solenoid('Sol. 11', 9.070, 0.0655, 'Bz.dat')
acc.add_solenoid('Sol. 12', 9.970, 0.075, 'Bz.dat')
acc.compile()
dim_z = hv.Dimension('z', unit='m')
dim_Ez = hv.Dimension('Ez', unit='MV/m', label='$E_z$')
dim_Bz = hv.Dimension('Bz', unit='Gs', label='$B_z$')
z = acc.z
z_Ez = hv.Curve((z, acc.Ez(z)), kdims=dim_z, vdims=dim_Ez)
z_Bz = hv.Curve((z, acc.Bz(z)*1e4), kdims=dim_z, vdims=dim_Bz)
(z_Ez + z_Bz).cols(1)
print(acc)
beam = rp.Beam(
type=rp.electron,
energy = 1.32, # MeV
current = 0.5e3, # A
radius_x = 48e-3, # initial r (m)
radius_y = 48e-3, # initial r (m)
radius_z = 3.5,
radius_xp = 2*35.0e-3, # initial r' (rad)
radius_yp = 2*35.0e-3, # initial r' (rad)
x = 0.0e-3, # horizontal centroid position (m)
xp = 0.0e-3, # horizontal centroid angle (rad)
y = 0, # vertical centroid position (m)
normalized_emittance = 200e-6*np.pi*3.58) # m*rad
beam.generate('KV', 80_000)
beam.df
dim_x = hv.Dimension('x', unit='m', range=(-0.1, 0.1))
dim_y = hv.Dimension('y', unit='m', range=(-0.1, 0.1))
dim_z = hv.Dimension('z', unit='m', range=(acc.z_start, acc.z_stop))
dim_px = hv.Dimension('px', unit='MeV/c', label='$p_x$')
dim_py = hv.Dimension('py', unit='MeV/c', label='$p_y$')
beam_x_y = hv.Scatter(beam.df, kdims=[dim_x, dim_y])
beam_z_x = hv.Scatter(beam.df, kdims=[dim_z, dim_x])
beam_x_px = hv.Scatter(beam.df, kdims=[dim_x, dim_px])
beam_y_py = hv.Scatter(beam.df, kdims=[dim_y, dim_py])
(beam_x_y + beam_z_x + beam_x_px + beam_y_py).cols(2)
print(beam)
kv_sim = kv.Simulation(beam, acc)
kv_sim.track()
rp_sim = rp.Simulation(beam, acc)
rp_sim.track()
def plot(i):
df = rp_sim.result[i]
kv_z_x = hv.Curve(((acc.z, kv_sim.envelope_x(acc.z))), kdims=[dim_z], vdims=[dim_x], label='kenv')*\
hv.Curve(((acc.parameter,-kv_sim.envelope_x(acc.z))), kdims=[dim_z], vdims=[dim_x])
rp_z_x = hv.Scatter(df, kdims=[dim_z, dim_x], label='redpic')
return rp_z_x*kv_z_x
items = [(i, plot(i)) for i in list(rp_sim.result.keys())]
hv.HoloMap(items, kdims = ['z']).collate()